package com.rabbit.recoverer;

import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.retry.RepublishMessageRecoverer;

/**
 * 用于处理 RabbitMQ 消息消费失败后的异常情况。
 * 当消息消费失败且重试次数耗尽后，此恢复器会被调用；它会将失败的消息重新发布到指定的交换机，通常用于发送到死信队列。
 * 适用于消费端的消息恢复策略。
 *
 * @author yuhuan
 * @date 2025/4/21
 */
public class ExceptionRepublishRecoverer extends RepublishMessageRecoverer {

    /**
     * 使用默认的错误交换机和路由键。
     * 默认的错误交换机名称为 "errorExchange"，默认的错误路由键为 "errorRoutingKey"。
     *
     * @param errorTemplate 用于重新发布消息的 AmqpTemplate 实例。
     */
    public ExceptionRepublishRecoverer(AmqpTemplate errorTemplate) {
        super(errorTemplate);
    }

    /**
     * 指定错误交换机名称。
     * 使用默认的错误路由键 "errorRoutingKey"。
     *
     * @param errorTemplate 用于重新发布消息的 AmqpTemplate 实例。
     * @param errorExchange 指定的错误交换机名称。
     */
    public ExceptionRepublishRecoverer(AmqpTemplate errorTemplate, String errorExchange) {
        super(errorTemplate, errorExchange);
    }

    /**
     * 指定错误交换机名称和错误路由键。
     *
     * @param errorTemplate   用于重新发布消息的 AmqpTemplate 实例。
     * @param errorExchange   指定的错误交换机名称。
     * @param errorRoutingKey 指定的错误路由键。
     */
    public ExceptionRepublishRecoverer(AmqpTemplate errorTemplate, String errorExchange, String errorRoutingKey) {
        super(errorTemplate, errorExchange, errorRoutingKey);
    }


    @Override
    public void recover(Message message, Throwable cause) {
        System.err.println("[消息恢复器]将消息推送到死信队列，错误: " + cause.getCause());
        super.recover(message, cause);
    }
}
